home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 3 / ACE CD 3.iso / files / utils / aplay200.lha / APlayer / Files / Developer.lha / Examples / apFredLibrary.S next >
Text File  |  1995-12-23  |  20KB  |  1,137 lines

  1. ; $VER: Fred.library 2.21
  2. ;
  3.  
  4.     INCDIR    "Includes3.0:Include3.0/"
  5.     INCLUDE    "Exec/Types.i"
  6.     INCLUDE    "Own/SystemBases.i"
  7.     INCLUDE    "Own/SystemStructures.i"
  8.     INCLUDE    "Own/SystemOffsets.i"
  9.     INCLUDE    "Own/AccessiblePlayer.i"
  10.  
  11.  
  12. VERSION        =    2
  13. REVISION    =    21
  14.  
  15. TRUE        =    -1
  16. FALSE        =    0
  17.  
  18. ; Library Data
  19.  
  20. LN_Name        =    10
  21. LN_Type        =    8
  22. NT_Library    =    9
  23.  
  24. LIBB_Summing    =    0
  25. LIBB_Changed    =    1
  26. LIBB_SumUsed    =    2
  27. LIBB_DelExp    =    3
  28.  
  29. LIBF_Summing    =    1<<LIBB_Summing
  30. LIBF_Changed    =    1<<LIBB_Changed
  31. LIBF_SumUsed    =    1<<LIBB_SumUsed
  32. LIBF_DelExp    =    1<<LIBB_DelExp
  33.  
  34. ; Macros
  35.  
  36. INBYTE    MACRO
  37.     dc.b    %11100000,0
  38.     dc.w    \1
  39.     dc.b    \2,0
  40.     ENDM
  41.  
  42. INWORD    MACRO
  43.     dc.b    %11010000,0
  44.     dc.w    \1,\2
  45.     ENDM
  46.  
  47. INLONG    MACRO
  48.     dc.b    %11000000,0
  49.     dc.w    \1
  50.     dc.l    \2
  51.     ENDM
  52.  
  53. ; Library Base Structure
  54.  
  55.     STRUCTURE LibraryStruct,0
  56.     STRUCT    LIB_Node,14
  57.     UBYTE    LIB_Flags
  58.     UBYTE    LIB_Pad
  59.     UWORD    LIB_NegSize
  60.     UWORD    LIB_PosSize
  61.     UWORD    LIB_Version
  62.     UWORD    LIB_Revision
  63.     APTR    LIB_IDString
  64.     ULONG    LIB_Sum
  65.     UWORD    LIB_OpenCnt
  66.  
  67.     LONG    LIB_SegList
  68.     LABEL    LibraryStruct_SIZEOF
  69.  
  70.  
  71.     SECTION    Fred.library,CODE
  72.  
  73. START    moveq    #0,d0
  74.     rts
  75. ;------------------------------------------------------------------------------
  76. LIBNAME    dc.b    "apFred.library",0
  77.  
  78. LIBID    dc.b    "Fred.library 2.21 (17-January-1995)",0
  79.     even
  80. ;------------------------------------------------------------------------------
  81. ; ROMTAG Structure
  82. ;
  83.  
  84. ROMTAG    dc.w    $4afc            ;ROMTAG Indentifier
  85.     dc.l    romtag
  86.     dc.l    slut
  87.     dc.b    $80            ;Flags
  88.     dc.b    version
  89.     dc.b    $09            ;Type Of Module
  90.     dc.b    $00            ;Initialization Priority
  91.     dc.l    libname
  92.     dc.l    libid
  93.     dc.l    autinit            ;Pointer To AUTOINIT Table
  94. ;------------------------------------------------------------------------------
  95. ; AUTOINIT Table
  96. ;
  97.  
  98. AUTINIT    dc.l    LibraryStruct_SIZEOF    ;Size Of Structure AFTER Base Address
  99.     dc.l    vector            ;Pointer To Vector Table
  100.     dc.l    inittab            ;Pointer To Init Structure
  101.     dc.l    init            ;Pointer To Init Routine
  102. ;------------------------------------------------------------------------------
  103. ; Init Table
  104. ;
  105.  
  106. INITTAB    INBYTE    LN_Type,NT_Library
  107.     INBYTE    LIB_Flags,LIBF_SumUsed!LIBF_Changed
  108.     INWORD    LIB_Version,version
  109.     INWORD    LIB_Revision,revision
  110.     INLONG    LN_Name,libname
  111.     INLONG    LIB_IDString,libid
  112.     dc.l    0
  113. ;------------------------------------------------------------------------------
  114. ; Vector Table
  115. ;
  116.  
  117. VECTOR    dc.w    -1
  118.     dc.w    opnlib-vector,clslib-vector,expunge-vector,extfunc-vector
  119.     dc.w    FP_GetTags-vector
  120.     dc.w    -1
  121. ;------------------------------------------------------------------------------
  122. ; Init Routine
  123. ;
  124.  
  125. INIT    movem.l    d1-d7/a0-a6,-(sp)
  126.     move.l    d0,a4            ;Base Address
  127.     move.l    a0,LIB_SegList(a4)
  128.  
  129.     move.l    a4,d0
  130.     movem.l    (sp)+,d1-d7/a0-a6
  131.     rts
  132. ;------------------------------------------------------------------------------
  133. ; Offset  -6: Open Library
  134. ;
  135.  
  136. OPNLIB    addq.w    #1,LIB_OpenCnt(a6)
  137.     bclr    #LIBB_DelExp,LIB_Flags(a6)
  138.     move.l    a6,d0
  139.     rts
  140. ;------------------------------------------------------------------------------
  141. ; Offset -12: Close Library
  142. ;
  143.  
  144. CLSLIB    moveq    #0,d0
  145.     subq.w    #1,LIB_OpenCnt(a6)
  146.     bne.b    clslibo
  147.     btst    #LIBB_DelExp,LIB_Flags(a6)
  148.     bne.b    expunge
  149. CLSLIBO    rts
  150. ;------------------------------------------------------------------------------
  151. ; Offset -18: Expunge
  152. ;
  153.  
  154. EXPUNGE    movem.l    d1-d7/a0-a6,-(sp)
  155.     move.l    a6,a4
  156.     tst.w    LIB_OpenCnt(a4)
  157.     beq.b    exp1
  158.     bset    #LIBB_DelExp,LIB_Flags(a4)
  159.     moveq    #0,d0
  160.     bra.b    expungo
  161.  
  162. EXP1    move.l    4.w,a6
  163.     move.l    LIB_SegList(a4),d2
  164.     move.l    a4,a1
  165.     jsr    Remove(a6)
  166.  
  167.     move.l    a4,a1
  168.     moveq    #0,d0
  169.     move.w    LIB_NegSize(a4),d0
  170.     sub.l    d0,a1
  171.     add.w    LIB_PosSize(a4),d0
  172.     jsr    FreeMem(a6)
  173.     move.l    d2,d0
  174.  
  175. EXPUNGO    movem.l    (sp)+,d1-d7/a0-a6
  176.     rts
  177. ;------------------------------------------------------------------------------
  178. ; Offset -24: ExtFunc
  179. ;
  180.  
  181. EXTFUNC    moveq    #0,d0
  182.     rts
  183. ;------------------------------------------------------------------------------
  184. ;******************************************************************************
  185. ;* Fred Player
  186. ;******************************************************************************
  187. ;------------------------------------------------------------------------------
  188. ; Offset -30: GetTags
  189. ;
  190. ; IN :    Nothing
  191. ;
  192. ; OUT:    A0 = Pointer To A TagList
  193. ;
  194.  
  195. FP_GetTags
  196.     lea    FP_Tags(pc),a0
  197.     rts
  198.  
  199. FP_Tags    dc.l    APT_RequestVersion,2
  200.     dc.l    APT_Check,FP_TestModule
  201.  
  202.     dc.l    APT_InitPlayer,FP_InitPlayer
  203.     dc.l    APT_EndPlayer,FP_EndPlayer
  204.     dc.l    APT_InitSound,FP_InitSound
  205.     dc.l    APT_EndSound,FP_EndSound
  206.     dc.l    APT_Interrupt,FP_PlayModule
  207.  
  208.     dc.l    APT_PlayerName,fpname
  209.     dc.l    APT_Description,fpdes
  210.  
  211.     dc.l    APT_SubSong,FP_SubSong
  212.     dc.l    APT_Pause,TRUE
  213.  
  214. FP_Skip    dc.l    TAG_SKIP,0
  215.     dc.l    APT_ChangeChannel,FP_ChangeChannel
  216.     dc.l    APT_Volume,TRUE
  217.     dc.l    TAG_END
  218.  
  219. FPNAME    dc.b    "Fred Player",0
  220. FPDES    dc.b    "Original player by JC & Fred.",10
  221.     dc.b    "Adapted by Tax.",10,10
  222.     dc.b    "This player will not use the",10
  223.     dc.b    "player in the module, except if",10
  224.     dc.b    "it's a player it can't reconise.",0
  225.     even
  226. ;------------------------------------------------------------------------------
  227. ; TestModule
  228. ;
  229. ; IN :    A1 = Address
  230. ;
  231. ; OUT:    D0 = Success (0=Unknown, 1=Ok, 2=Error)
  232. ;
  233.  
  234. FP_TestModule
  235.     movem.l    d1-d2/a1,-(sp)
  236.  
  237.     cmp.w    #$4efa,(a1)
  238.     bne.b    .tsmod3
  239.     cmp.w    #$4efa,4(a1)
  240.     bne.b    .tsmod3
  241.     cmp.w    #$4efa,8(a1)
  242.     bne.b    .tsmod3
  243.     cmp.w    #$4efa,12(a1)
  244.     bne.b    .tsmod3
  245.  
  246.     moveq    #0,d1
  247.     move.w    2(a1),d1
  248.     add.l    d1,a1
  249.     moveq    #4-1,d2
  250. .TSMOD1    cmp.w    #$123a,2(a1)
  251.     bne.b    .tsmod2
  252.     cmp.w    #$b001,6(a1)
  253.     beq.b    .tsmod4
  254. .TSMOD2    addq.l    #2,a1
  255.     dbra    d2,.tsmod1
  256.  
  257. .TSMOD3    moveq    #0,d0            ;Unknown
  258.     bra.b    .tsmodo
  259.  
  260. .TSMOD4    move.w    4(a1),d1
  261.     add.l    d1,a1
  262.  
  263.     moveq    #0,d1
  264.     move.b    4(a1),d1
  265.     addq.w    #1,d1
  266.     lea    maxtune(pc),a1
  267.     move.w    d1,(a1)
  268.  
  269.     moveq    #1,d0            ;Ok
  270. .TSMODO    movem.l    (sp)+,d1-d2/a1
  271.     rts
  272. ;------------------------------------------------------------------------------
  273. ; InitPlayer
  274. ;
  275. ; IN :    A1 = Address
  276. ;
  277. ; OUT:    D1 = Success (0=Error)
  278. ;
  279.  
  280. FP_InitPlayer
  281.     movem.l    d0/a0-a1,-(sp)
  282.     lea    module(pc),a0
  283.     move.l    a1,(a0)
  284.     lea    global(pc),a0
  285.     move.l    a5,(a0)
  286.  
  287.     move.w    2(a1),d0
  288.     lea    2(a1,d0.w),a1        ;Set New Address
  289.     move.l    a1,d0
  290.     sub.l    module(pc),d0
  291.     lea    modadd(pc),a0
  292.     move.l    d0,(a0)
  293.  
  294. ; Start To See If We Can Use The Intern Player
  295.  
  296.     moveq    #0,d0            ;Set Flag As Extern
  297.     moveq    #2,d1
  298.     cmp.w    #$47fa,$86(a1)
  299.     bne.b    .inipl1
  300.     cmp.w    #$33fc,$8e(a1)
  301.     bne.b    .inipl1
  302.     cmp.w    #$1019,$1ba(a1)
  303.     bne.b    .inipl1
  304.     cmp.w    #$7200,$1be(a1)
  305.     bne.b    .inipl1
  306.     cmp.w    #$51cd,$3cc(a1)
  307.     bne.b    .inipl1
  308.     cmp.w    #$4e75,$3d0(a1)
  309.     bne.b    .inipl1
  310.     cmp.w    #$117c,$7be(a1)
  311.     bne.b    .inipl1
  312.     cmp.w    #$116d,$7ca(a1)
  313.     bne.b    .inipl1
  314.     cmp.w    #$47fa,$7d6(a1)
  315.     bne.b    .inipl1
  316.     moveq    #1,d0            ;Set Flag As Intern
  317.     moveq    #0,d1
  318. .INIPL1    lea    useply(pc),a0
  319.     move.b    d0,(a0)            ;Store Use Player Flag
  320.     lea    FP_Skip(pc),a0
  321.     move.l    d1,4(a0)
  322.  
  323.     lea    v1str,a0
  324.     moveq    #0,d0
  325.     move.w    #(4*128+$32*2)/2-1,d1
  326. .INIPL2    move.w    d0,(a0)+        ;Clear BSS Area
  327.     dbra    d1,.inipl2
  328.  
  329.     move.l    APG_AllocChannels(a5),a0
  330.     jsr    (a0)
  331.     move.l    d0,d1
  332.     movem.l    (sp)+,d0/a0-a1
  333.     rts
  334. ;------------------------------------------------------------------------------
  335. ; EndPlayer
  336. ;
  337. ; IN :    A1 = Address
  338. ;
  339. ; OUT:    Nothing
  340. ;
  341.  
  342. FP_EndPlayer
  343.     move.l    a0,-(sp)
  344.     move.l    APG_FreeChannels(a5),a0
  345.     jsr    (a0)
  346.     move.l    (sp)+,a0
  347.     rts
  348. ;------------------------------------------------------------------------------
  349. ; InitSound
  350. ;
  351. ; IN :    A1 = Address
  352. ;
  353. ; OUT:    Nothing
  354. ;
  355.  
  356. FP_InitSound
  357.     movem.l    d0-d7/a0-a6,-(sp)
  358.  
  359.     lea    useply(pc),a0
  360.     tst.b    (a0)
  361.     beq.b    .inisn1
  362.     move.l    a1,a0
  363.     add.l    modadd(pc),a0
  364.     lea    fredp(pc),a1
  365.  
  366. .INISN1    move.w    APG_Tune(a5),d0
  367.     ext.l    d0
  368.     jsr    (a1)            ;Init Module
  369.  
  370.     movem.l    (sp)+,d0-d7/a0-a6
  371.     rts
  372. ;------------------------------------------------------------------------------
  373. ; EndSound
  374. ;
  375. ; IN :    A1 = Address
  376. ;
  377. ; OUT:    Nothing
  378. ;
  379.  
  380. FP_EndSound
  381.     movem.l    d0-d7/a0-a6,-(sp)
  382.  
  383.     lea    useply(pc),a0
  384.     tst.b    (a0)
  385.     beq.b    .endsn1
  386.     lea    fredp(pc),a1
  387.  
  388. .ENDSN1    moveq    #0,d1
  389.     jsr    8(a1)            ;Stop Module Playing
  390.  
  391.     moveq    #0,d0
  392.     move.w    d0,$dff0a8
  393.     move.w    d0,$dff0b8
  394.     move.w    d0,$dff0c8
  395.     move.w    d0,$dff0d8
  396.  
  397.     movem.l    (sp)+,d0-d7/a0-a6
  398.     rts
  399. ;------------------------------------------------------------------------------
  400. ; PlayModule
  401. ;
  402. ; IN :    A1 = Address
  403. ;    D1 = VBlank/Cia (0=CIA)
  404. ;
  405. ; OUT:    Nothing
  406. ;
  407.  
  408. FP_PlayModule
  409.     movem.l    d0-d7/a0-a6,-(sp)
  410.  
  411.     lea    useply(pc),a0
  412.     tst.b    (a0)
  413.     beq.b    .plymo1
  414.     move.l    a1,a0
  415.     lea    fredp(pc),a1
  416.  
  417. .PLYMO1    jsr    4(a1)            ;Play Module
  418.     movem.l    (sp)+,d0-d7/a0-a6
  419.     rts
  420. ;------------------------------------------------------------------------------
  421. ; SubSong
  422. ;
  423. ; IN :    A1 = Address
  424. ;
  425. ; OUT:    A0 = Pointer To Two SubSongs Words
  426. ;
  427.  
  428. FP_SubSong
  429.     lea    maxtune(pc),a0
  430.     rts
  431. ;------------------------------------------------------------------------------
  432. ; ChangeChannel
  433. ;
  434. ; IN :    A1 = Address
  435. ;    D1 = Channel (0-3)
  436. ;    D2 = State (0=Off 1=On)
  437. ;
  438. ; OUT:    Nothing
  439. ;
  440.  
  441. FP_ChangeChannel
  442.     movem.l    d0-d4/a0,-(sp)
  443.  
  444.     moveq    #0,d0
  445.     moveq    #-1,d3
  446.     bclr    d1,d3
  447.     tst.b    d2
  448.     beq.b    .chgch1
  449.     bset    d1,d0
  450.  
  451. .CHGCH1    lea    chan(pc),a0
  452.     move.b    (a0),d4
  453.     and.b    d3,d4
  454.     or.b    d0,d4
  455.     move.b    d4,(a0)
  456.  
  457.     movem.l    (sp)+,d0-d4/a0
  458.     rts
  459. ;------------------------------------------------------------------------------
  460. GLOBAL    dc.l    0
  461. MODULE    dc.l    0
  462. MODADD    dc.l    0
  463. MAXTUNE    dc.w    0,0
  464.  
  465. D800    dc.w    0
  466. USEPLY    dc.b    0
  467. CURSNG    dc.b    0
  468. CUROFF    dc.b    0
  469. FPLAYIT    dc.b    -1
  470. D7FF    dc.b    0
  471. D802    dc.b    0
  472. CHAN    dc.b    15
  473.     even
  474. ;------------------------------------------------------------------------------
  475. MULTAB    dc.w    $2000,$1e30,$1c80,$1ae8,$1968,$17f8,$16a0,$1558
  476.     dc.w    $1428,$1308,$11f8,$10f0,$1000,$f18,$e40,$d74,$cb4
  477.     dc.w    $bfc,$b50,$aac,$a14,$984,$8fc,$878,$800,$78c,$720
  478.     dc.w    $6ba,$65a,$5fe,$5a8,$556,$50a,$4c2,$47e,$43c,$400
  479.     dc.w    $3c6,$390,$35d,$32d,$2ff,$2d4,$2ab,$285,$261,$23f
  480.     dc.w    $21e,$200,$1e3,$1c8,$1ae,$196,$17f,$16a,$155,$142
  481.     dc.w    $130,$11f,$10f,$100,$f1,$e4,$d7,$cb,$bf,$b5,$aa
  482.     dc.w    $a1,$98,$8f,$87
  483. ;------------------------------------------------------------------------------
  484. ; Fred Player
  485. ;
  486.  
  487. FREDP    jmp    fredini(pc)
  488.     jmp    fredply(pc)
  489.     jmp    fredstp(pc)
  490.     jmp    fredqqq(pc)
  491. ;------------------------------------------------------------------------------
  492. ; Initialize Module
  493. ;
  494.  
  495. FREDINI    move.b    $895-$12(a0),d1        ;Number Of Songs
  496.     cmp.b    d1,d0
  497.     bhi.b    fredstp
  498.     lea    cursng(pc),a3
  499.     move.b    d0,(a3)
  500.     lea    $897-$12(a0),a2
  501.     lea    curoff(pc),a4
  502.     add.l    d0,a2
  503.     move.b    (a2),(a4)
  504.  
  505.     lsl.l    #3,d0
  506.     moveq    #0,d6
  507.     lea    v1str,a4
  508.     moveq    #4-1,d7
  509. .FREIN1    move.w    #1,$20(a4)
  510.     clr.w    $3a(a4)
  511.     lea    $b0e-$12(a0),a1
  512.     move.l    a1,a2
  513.     lea    (a1,d0.w),a1
  514.     add.w    (a1,d6.w),a2
  515.     move.l    a2,(a4)
  516.     move.l    a0,a3
  517.     add.l    $8a6-$12(a0),a3
  518.     sub.l    modadd(pc),a3
  519.     add.w    (a2),a3
  520.     move.l    a3,8(a4)
  521.     st    $1e(a4)
  522.     lea    $80(a4),a4
  523.     addq.b    #2,d6
  524.     dbra    d7,.frein1
  525.  
  526.     lea    fplayit(pc),a3
  527.     clr.b    (a3)
  528.     lea    d800(pc),a3
  529.     move.w    #$1000,(a3)
  530.     lea    d7ff(pc),a3
  531.     sf    (a3)
  532.     rts
  533. ;------------------------------------------------------------------------------
  534. ; ???
  535. ;
  536.  
  537. FREDQQQ    lea    d802(pc),a3
  538.     move.b    d0,(a3)
  539.     lea    d7ff(pc),a3
  540.     st    (a3)
  541.     rts
  542. ;------------------------------------------------------------------------------
  543. ; Stop Module
  544. ;
  545.  
  546. FREDSTP    lea    fplayit(pc),a3
  547.     move.b    #$ff,(a3)
  548.     move.w    #15,$dff096
  549.     rts
  550. ;------------------------------------------------------------------------------
  551. ; Play Module
  552. ;
  553.  
  554. FREDPLY    lea    fplayit(pc),a3
  555.     tst.b    (a3)
  556.     beq.b    fp0b6
  557.     rts
  558.  
  559. FP0B6    moveq    #0,d4
  560.     moveq    #4-1,d5
  561. FP0BA    moveq    #0,d7
  562.     move.w    d5,d0
  563.     lsl.w    #4,d0
  564.     lea    $dff000,a6
  565.     add.w    d0,a6
  566.     move.l    d5,d0
  567.     lsl.l    #7,d0
  568.     lea    v1str,a0
  569.     add.l    d0,a0
  570.     move.l    8(a0),a1
  571.     move.l    12(a0),a5
  572.     tst.b    $1e(a0)
  573.     bne.b    fp12a
  574.     st    $1e(a0)
  575.     moveq    #0,d0
  576.     move.w    4(a5),d0
  577.     beq.b    fp11c
  578.     bmi.b    fp12a
  579.     move.l    module(pc),a2
  580.     add.l    (a5),a2
  581.     add.l    d0,a2
  582.     move.w    6(a5),d1
  583.     sub.w    d0,d1
  584.     tst.b    $27(a5)
  585.     beq.b    fp110
  586.     lea    $40(a0),a2
  587. FP110    btst    d5,chan
  588.     beq.b    fp12a
  589.     move.l    a2,$a0(a6)        ;Address
  590.     move.w    d1,$a4(a6)        ;Length
  591.     bra.b    fp12a
  592.  
  593. FP11C    lea    empsamp,a2
  594.     btst    d5,chan
  595.     beq.b    fp12a
  596.     move.l    a2,$a0(a6)        ;Address
  597.     move.w    #$32,$a4(a6)        ;Length
  598.  
  599. FP12A    subq.w    #1,$20(a0)
  600.     tst.w    $20(a0)
  601.     beq.b    fp156
  602.     cmp.w    #1,$20(a0)
  603.     bne.w    fp3e4
  604.     cmp.b    #$a0,(a1)
  605.     bpl.w    fp3e4
  606.     moveq    #0,d1
  607.     bset    d5,d1
  608.     move.w    d1,$dff096        ;Turn Off DMA
  609.     bra.w    fp3e4
  610.  
  611. FP156    move.l    12(a0),a5
  612.     moveq    #0,d0
  613.     move.b    (a1)+,d0
  614.     bpl.w    fp2c0
  615.     cmp.b    #$83,d0
  616.     beq.b    fp1a0
  617.     cmp.b    #$82,d0
  618.     beq.b    fp1bc
  619.     cmp.b    #$81,d0
  620.     beq.b    fp1cc
  621.     cmp.b    #$84,d0
  622.     beq.w    fp21c
  623.     cmp.b    #$80,d0
  624.     beq.w    fp23c
  625.     neg.b    d0
  626.     moveq    #0,d1
  627.     move.b    curoff(pc),d1
  628.     mulu    d1,d0
  629.     move.w    d0,$20(a0)
  630.     move.l    a1,8(a0)
  631.     bra.w    fp3e4
  632.  
  633. FP1A0    move.b    (a1)+,d0
  634.     move.l    module(pc),a5
  635.     add.l    modadd(pc),a5
  636.     add.l    $8a2-$12(a5),a5
  637.     sub.l    modadd(pc),a5
  638.     lsl.w    #6,d0
  639.     add.l    d0,a5
  640.     move.l    a5,12(a0)
  641.     moveq    #-1,d7
  642.     move.l    a1,8(a0)
  643.     bra.b    fp156
  644.  
  645. FP1BC    move.b    (a1)+,d0
  646.     lea    curoff(pc),a4
  647.     move.b    d0,(a4)
  648.     move.l    a1,8(a0)
  649.     bra.b    fp156
  650.  
  651. FP1CC    move.b    (a1)+,d0
  652.     move.l    d0,d2
  653.     moveq    #0,d1
  654.     move.b    curoff(pc),d1
  655.     mulu    d2,d1
  656.     move.w    d1,$2a(a0)
  657.     lea    multab(pc),a2
  658.  
  659.     clr.w    d1            ;;Added By Tax
  660.     move.l    a5,d2            ;;
  661.     beq.b    fp1cca            ;;Removed Enforcer Hit!!!!
  662.     move.w    8(a5),d1
  663.  
  664. FP1CCa    moveq    #10,d2
  665.     move.b    (a1)+,d0
  666.     move.b    d0,$23(a0)
  667.     lsl.w    #1,d0
  668.     move.w    (a2,d0.w),d0
  669.     mulu    d1,d0
  670.     lsr.l    d2,d0
  671.     move.w    d0,$1a(a0)
  672.     move.w    #0,$24(a0)
  673.     moveq    #0,d0
  674.     moveq    #0,d1
  675.     move.b    (a1)+,d0
  676.     move.b    curoff(pc),d1
  677.     mulu    d1,d0
  678.     move.w    d0,$16(a0)
  679.     st    $15(a0)
  680.     move.l    a1,8(a0)
  681.     bra.w    fp156
  682.  
  683. FP21C    moveq    #0,d1
  684.     bset    d5,d1
  685.     move.w    d1,$dff096        ;Turn Off DMA
  686.     moveq    #0,d1
  687.     move.b    curoff(pc),d1
  688.     move.w    d1,$20(a0)
  689.     st    $1e(a0)
  690.     move.l    a1,8(a0)
  691.     bra.w    fp3de
  692.  
  693. FP23C    moveq    #0,d0
  694.     moveq    #0,d1
  695.     moveq    #0,d2
  696.     moveq    #0,d3
  697.     move.w    $3a(a0),d0
  698.     addq.w    #2,d0
  699. FP24A    move.l    (a0),a3
  700.     add.l    d0,a3
  701.     move.w    (a3),d2
  702.     cmp.w    #-1,d2
  703.     beq.b    fp28e
  704.     tst.w    d2
  705.     bmi.b    fp27e
  706.     move.w    d0,$3a(a0)
  707.     move.l    module(pc),a3
  708.     add.l    modadd(pc),a3
  709.     add.l    $8a6-$12(a3),a3
  710.     sub.l    modadd(pc),a3
  711.     add.l    d2,a3
  712.     move.l    a3,8(a0)
  713.     move.w    #1,$20(a0)
  714.     bra.w    fp0ba
  715.  
  716. FP27E    bclr    #15,d2
  717.     move.w    d2,d0
  718.     and.l    #$ffff,d0
  719.     bra.b    fp24a
  720.  
  721. FP28E    lea    fplayit(pc),a2
  722.     move.b    #$ff,(a2)
  723.     move.w    #0,$dff0a8
  724.     move.w    #0,$dff0b8
  725.     move.w    #0,$dff0c8
  726.     move.w    #0,$dff0d8
  727.     move.w    #15,$dff096
  728.     rts
  729.  
  730. FP2C0    move.l    a1,8(a0)
  731.     move.b    d0,$19(a0)
  732.     sf    $2f(a0)
  733.     move.b    $26(a5),$30(a0)
  734.     move.b    10(a5),$10(a0)
  735.     move.b    12(a5),$12(a0)
  736.     move.b    13(a5),$13(a0)
  737.     st    $22(a0)
  738.     move.b    #0,$14(a0)
  739.     cmp.b    #1,$27(a5)
  740.     beq.b    fp306
  741.     cmp.b    #2,$27(a5)
  742.     beq.b    fp31e
  743.     bra.b    fp336
  744.  
  745. FP306    tst.b    d7
  746.     bne.b    fp316
  747.     btst    #1,$2e(a5)
  748.     beq.b    fp336
  749. FP316    bsr.w    fp782
  750.     bra.b    fp336
  751.  
  752. FP31E    tst.b    d7
  753.     bne.b    fp32e
  754.     btst    #3,$2e(a5)
  755.     beq.b    fp336
  756. FP32E    bsr.w    fp7d0
  757.  
  758. FP336    moveq    #0,d1
  759.     move.b    curoff(pc),d1
  760.     move.w    d1,$20(a0)
  761.     move.l    module(pc),a2
  762.     add.l    (a5),a2
  763.     tst.b    $27(a5)
  764.     beq.b    fp354
  765.     lea    $40(a0),a2
  766. FP354    btst    d5,chan
  767.     beq.b    fp354a
  768.     move.l    a2,$a0(a6)        ;Address
  769.     move.w    6(a5),$a4(a6)        ;Length
  770. FP354a    moveq    #0,d1
  771.     move.b    d1,$2c(a0)
  772.     move.w    d1,$a8(a6)        ;Volume
  773.     move.b    #0,$2d(a0)
  774.     move.b    $13(a5),$2e(a0)
  775.     moveq    #0,d0
  776.     lea    multab(pc),a2
  777.     move.w    8(a5),d1
  778.     moveq    #10,d2
  779.     move.b    $19(a0),d0
  780.     lsl.w    #1,d0
  781.     move.w    (a2,d0.w),d0
  782.     mulu    d1,d0
  783.     lsr.l    d2,d0
  784.     btst    d5,chan
  785.     beq.b    fp354b
  786.     move.w    d0,$a6(a6)        ;Period
  787. FP354b    move.w    d0,$1c(a0)
  788.     tst.b    $15(a0)
  789.     beq.b    fp3c0
  790.     tst.w    $24(a0)
  791.     bne.b    fp3c0
  792.     move.w    $1a(a0),d0
  793.     sub.w    $1c(a0),d0
  794.     move.w    d0,$26(a0)
  795.     move.w    #1,$28(a0)
  796.     move.w    $1c(a0),$24(a0)
  797.  
  798. FP3C0    move.b    chan(pc),d1
  799.     btst    d5,d1
  800.     beq.b    fp3de
  801.     move.w    #$8200,d1
  802.     bset    d5,d1
  803.     move.w    d1,$dff096        ;Turn On DMA
  804.     sf    $1e(a0)
  805.     bra.b    fp3e4
  806.  
  807. FP3DE    dbra    d5,fp0ba
  808.     rts
  809.  
  810. FP3E4    btst    d5,$dff003        ;Check DMA Bit (DMACONR)
  811.     beq.b    fp3de
  812.     moveq    #0,d0
  813.     move.b    $19(a0),d0
  814.     moveq    #0,d1
  815.     move.b    $2f(a0),d1
  816.     move.b    $16(a5,d1.w),d2
  817.     add.b    d2,d0
  818.     subq.b    #1,$30(a0)
  819.     bne.b    fp424
  820.     move.b    $26(a5),$30(a0)
  821.     addq.b    #1,$2f(a0)
  822.     move.b    $33(a5),d3
  823.     cmp.b    $2f(a0),d3
  824.     bne.b    fp424
  825.     move.b    #0,$2f(a0)
  826. FP424    lea    multab(pc),a2
  827.     move.w    8(a5),d1
  828.     moveq    #10,d2
  829.     lsl.w    #1,d0
  830.     move.w    (a2,d0.w),d0
  831.     mulu    d1,d0
  832.     lsr.l    d2,d0
  833.     move.w    d0,$1c(a0)
  834.     tst.b    $15(a0)
  835.     beq.b    fp482
  836.     tst.w    $16(a0)
  837.     beq.b    fp454
  838.     subq.w    #1,$16(a0)
  839.     bra.b    fp482
  840.  
  841. FP454    moveq    #0,d1
  842.     move.w    $28(a0),d1
  843.     muls    $26(a0),d1
  844.     divs    $2a(a0),d1
  845.     add.w    d1,$1c(a0)
  846.     add.w    #1,$28(a0)
  847.     move.w    $28(a0),d2
  848.     cmp.w    $2a(a0),d2
  849.     ble.b    fp482
  850.     move.b    $23(a0),$19(a0)
  851.     sf    $15(a0)
  852. FP482    move.w    $1c(a0),d0
  853.     tst.b    $10(a0)
  854.     beq.b    fp496
  855.     subq.b    #1,$10(a0)
  856.     bra.b    fp4fa
  857.  
  858. FP496    tst.b    $22(a0)
  859.     beq.b    fp4fa
  860.     bpl.b    fp4c2
  861.     moveq    #0,d1
  862.     move.b    $14(a0),d1
  863.     add.b    $12(a0),d1
  864.     move.b    d1,$14(a0)
  865.     cmp.b    $13(a0),d1
  866.     bne.b    fp4d8
  867.     bchg    #7,$22(a0)
  868.     bra.b    fp4d8
  869.  
  870. FP4C2    move.b    $14(a0),d1
  871.     sub.b    $12(a0),d1
  872.     move.b    d1,$14(a0)
  873.     bne.b    fp4d8
  874.     bchg    #7,$22(a0)
  875. FP4D8    tst.b    $14(a0)
  876.     bne.b    fp4e6
  877.     bchg    #0,$22(a0)
  878. FP4E6    ext.w    d1
  879.     btst    #0,$22(a0)
  880.     beq.b    fp4f8
  881.     add.w    d1,d0
  882.     bra.b    fp4fa
  883.  
  884. FP4F8    sub.w    d1,d0
  885. FP4FA    btst    d5,chan
  886.     beq.b    fp4faa
  887.     move.w    d0,$a6(a6)        ;Period
  888. FP4FAa    tst.b    $2d(a0)
  889.     beq.b    fp52a
  890.     cmp.b    #1,$2d(a0)
  891.     beq.b    fp556
  892.     cmp.b    #2,$2d(a0)
  893.     beq.b    fp582
  894.     cmp.b    #3,$2d(a0)
  895.     beq.b    fp59c
  896.     bra.w    fp5c8
  897.  
  898. FP52A    moveq    #0,d0
  899.     moveq    #0,d1
  900.     moveq    #0,d2
  901.     move.b    15(a5),d2
  902.     move.b    $10(a5),d1
  903.     move.b    $2c(a0),d0
  904.     add.w    d2,d0
  905.     move.b    d0,$2c(a0)
  906.     cmp.w    d1,d0
  907.     blt.b    fp5c8
  908.     move.b    d1,$2c(a0)
  909.     move.b    #1,$2d(a0)
  910.     bra.b    fp5c8
  911.  
  912. FP556    moveq    #0,d0
  913.     moveq    #0,d1
  914.     moveq    #0,d2
  915.     move.b    $11(a5),d2
  916.     move.b    $12(a5),d1
  917.     move.b    $2c(a0),d0
  918.     sub.w    d2,d0
  919.     move.b    d0,$2c(a0)
  920.     cmp.w    d1,d0
  921.     bgt.b    fp5c8
  922.     move.b    d1,$2c(a0)
  923.     move.b    #2,$2d(a0)
  924.     bra.b    fp5c8
  925.  
  926. FP582    tst.b    $2e(a0)
  927.     bne.b    fp594
  928.     move.b    #3,$2d(a0)
  929.     bra.b    fp5c8
  930.  
  931. FP594    subq.b    #1,$2e(a0)
  932.     bra.b    fp5c8
  933.  
  934. FP59C    moveq    #0,d0
  935.     moveq    #0,d1
  936.     moveq    #0,d2
  937.     move.b    $14(a5),d2
  938.     move.b    $15(a5),d1
  939.     move.b    $2c(a0),d0
  940.     sub.w    d2,d0
  941.     move.b    d0,$2c(a0)
  942.     cmp.w    d1,d0
  943.     bgt.b    fp5c8
  944.     move.b    d1,$2c(a0)
  945.     move.b    #4,$2d(a0)
  946.  
  947. FP5C8    moveq    #0,d0
  948.     moveq    #0,d1
  949.     moveq    #0,d2
  950.     moveq    #0,d4
  951.     move.b    $2c(a0),d0
  952.     move.b    14(a5),d1
  953.     lea    d800(pc),a3
  954.     move.w    (a3),d2
  955.     move.b    d7ff(pc),d3
  956.     tst.b    d3
  957.     beq.b    fp608
  958.     move.b    d802(pc),d4
  959.     sub.w    d4,d2
  960.     tst.w    d2
  961.     bmi.b    fp5fa
  962.     move.w    d2,(a3)
  963.     bra.b    fp608
  964.  
  965. FP5FA    clr.w    (a3)
  966.     clr.l    d2
  967.     lea    fplayit(pc),a3
  968.     move.b    #$ff,(a3)
  969.     rts
  970.  
  971. FP608    mulu    d2,d1
  972.     lsr.l    #8,d1
  973.     lsr.l    #4,d1
  974.     mulu    d1,d0
  975.     lsr.l    #8,d0
  976.     lsr.l    #1,d0
  977.     btst    d5,chan
  978.     beq.b    fp608a
  979.  
  980.     movem.l    d0/a5,-(sp)
  981.     move.l    global(pc),a5
  982.     move.l    APG_CalcVolume(a5),a5
  983.     jsr    (a5)            ;Calculate The New Volume
  984.     move.w    d0,$a8(a6)        ;Volume
  985.     movem.l    (sp)+,d0/a5
  986.  
  987. FP608a    tst.b    $27(a5)
  988.     bne.b    fp624
  989.     bra.w    fp3de
  990.  
  991. FP624    cmp.b    #2,$27(a5)
  992.     beq.w    fp6ce
  993.     tst.b    $32(a0)
  994.     beq.b    fp63e
  995.     subq.b    #1,$32(a0)
  996.     bra.w    fp3de
  997.  
  998. FP63E    tst.b    $34(a0)
  999.     beq.b    fp64e
  1000.     subq.b    #1,$34(a0)
  1001.     bra.w    fp3de
  1002.  
  1003. FP64E    btst    #0,$2e(a5)
  1004.     beq.b    fp660
  1005.     tst.b    $3c(a0)
  1006.     beq.w    fp770
  1007. FP660    move.b    $2a(a5),$34(a0)
  1008.     moveq    #0,d0
  1009.     moveq    #0,d1
  1010.     moveq    #0,d2
  1011.     move.b    $31(a0),d0
  1012.     move.b    $2b(a5),d1
  1013.     move.b    $2c(a5),d2
  1014.     lea    $40(a0),a2
  1015.     btst    #2,$33(a0)
  1016.     bne.b    fp698
  1017. FP686    cmp.b    d2,d0
  1018.     ble.b    fp6ae
  1019.     bset    #2,$33(a0)
  1020.     subq.b    #1,$3c(a0)
  1021.     subq.b    #1,d0
  1022. FP698    cmp.b    d1,d0
  1023.     bge.b    fp6be
  1024.     bclr    #2,$33(a0)
  1025.     subq.b    #1,$3c(a0)
  1026.     addq.b    #1,d0
  1027.     bra.b    fp686
  1028.  
  1029. FP6AE    move.b    $28(a5),(a2,d0.w)
  1030.     addq.b    #1,d0
  1031.     move.b    d0,$31(a0)
  1032.     bra.w    fp3de
  1033.  
  1034. FP6BE    move.b    $29(a5),(a2,d0.w)
  1035.     subq.b    #1,d0
  1036.     move.b    d0,$31(a0)
  1037.     bra.w    fp3de
  1038.  
  1039. FP6CE    tst.b    $39(a0)
  1040.     beq.b    fp6de
  1041.     subq.b    #1,$39(a0)
  1042.     bra.w    fp3de
  1043.  
  1044. FP6DE    btst    #2,$2e(a5)
  1045.     beq.b    fp6f0
  1046.     tst.b    $3d(a0)
  1047.     beq.b    fp770
  1048. FP6F0    tst.b    $38(a0)
  1049.     bne.b    fp72c
  1050.     moveq    #0,d1
  1051.     move.b    $2f(a5),d1
  1052.     moveq    #1,d0
  1053.     lsl.l    d1,d0
  1054.     cmp.w    $36(a0),d0
  1055.     beq.b    fp774
  1056.     moveq    #0,d3
  1057.     addq.w    #1,$36(a0)
  1058.     move.w    $36(a0),d3
  1059.     lea    $40(a0),a4
  1060.     move.l    module(pc),a3
  1061.     add.l    (a5),a3
  1062.     lea    $20(a3),a2
  1063.     moveq    #32-1,d2
  1064.     bra.b    fp75c
  1065.  
  1066. FP72C    moveq    #0,d0
  1067.     move.w    $36(a0),d0
  1068.     cmp.w    #1,d0
  1069.     beq.b    fp774
  1070.     moveq    #0,d3
  1071.     subq.w    #1,$36(a0)
  1072.     move.w    $36(a0),d3
  1073.     lea    $40(a0),a4
  1074.     move.l    module(pc),a3
  1075.     add.l    (a5),a3
  1076.     lea    $20(a3),a2
  1077.     moveq    #32-1,d2
  1078.  
  1079. FP75C    moveq    #0,d6
  1080.     move.b    $2f(a5),d6
  1081. FP762    move.l    d3,d1
  1082.     muls    (a2)+,d1
  1083.     lsr.l    d6,d1
  1084.     add.b    (a3)+,d1
  1085.     move.b    d1,(a4)+
  1086.     dbra    d2,fp762
  1087. FP770    bra.w    fp3de
  1088.  
  1089. FP774    eor.b    #1,$38(a0)
  1090.     subq.b    #1,$3d(a0)
  1091.     bra.w    fp6de
  1092.  
  1093. FP782    moveq    #0,d1
  1094.     moveq    #0,d2
  1095.     moveq    #0,d3
  1096.     move.b    $31(a5),$3c(a0)
  1097.     move.b    $2d(a5),$32(a0)
  1098.     move.b    $2a(a5),$34(a0)
  1099.     move.b    #0,$33(a0)
  1100.     move.b    $2b(a5),$31(a0)
  1101.     lea    $40(a0),a4
  1102.     move.w    6(a5),d1
  1103.     add.b    d1,d1
  1104.     move.b    d1,d2
  1105.     move.b    $2b(a5),d3
  1106.     subq.b    #1,d3
  1107. FP7B8    move.b    $28(a5),(a4)+
  1108.     dbra    d3,fp7b8
  1109.     sub.b    $2b(a5),d1
  1110.     subq.b    #1,d1
  1111. FP7C6    move.b    $29(a5),(a4)+
  1112.     dbra    d1,fp7c6
  1113.     rts
  1114.  
  1115. FP7D0    move.b    #0,$38(a0)
  1116.     move.w    #1,$36(a0)
  1117.     move.b    $32(a5),$3d(a0)
  1118.     move.b    $30(a5),$39(a0)
  1119.     move.l    module(pc),a3
  1120.     add.l    (a5),a3
  1121.     lea    $40(a0),a4
  1122.     moveq    #32-1,d1
  1123. FP7F6    move.b    (a3)+,(a4)+
  1124.     dbra    d1,fp7f6
  1125.     rts
  1126. ;------------------------------------------------------------------------------
  1127.     SECTION    FredData,BSS_C
  1128.  
  1129. V1STR    ds.b    128
  1130. V2STR    ds.b    128
  1131. V3STR    ds.b    128
  1132. V4STR    ds.b    128
  1133.  
  1134. EMPSAMP    ds.w    $32
  1135. ;------------------------------------------------------------------------------
  1136. SLUT
  1137.